package com.springboot.demo.service;

import com.springboot.demo.entity.PageRequest;
import com.springboot.demo.entity.PageResult;
import com.springboot.demo.entity.SystemLog;
import com.springboot.demo.entity.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;


/**
 * @author wubc683
 * @desc
 * @date 2021-07-26 10:05
 */
public interface UserService extends UserDetailsService {

    /**
     * 实现security框架默认方法
     *
     * @param username
     * @return: com.springboot.demo.entity.User
     */
    @Override
    UserDetails loadUserByUsername(String username);

    /**
     * 检查用户名是否存在
     *
     * @param username
     * @return: java.lang.Boolean
     */
    Boolean IsUsernameExisted(String username);

    /**
     * 注册用户
     *
     * @param user
     * @return: com.springboot.demo.utils.ResponseResult
     */
    void saveUser(User user);

    /**
     * 忘记密码
     *
     * @param user
     * @return: void
     */
    void updatePasswordByPhone(User user);

    /**
     * 查询手机号是否已注册
     *
     * @param phone
     * @return: com.springboot.demo.utils.ResponseResult
     */
    Boolean isPhoneRegistered(String phone);

    /**
     * 修改用户密码
     *
     * @param id
     * @param user
     * @return: void
     */
    void updatePassword(Long id, User user);

    /**
     * 找回用户名通过手机
     *
     * @param user
     * @return: java.lang.String
     */
    String findUsernameByPhone(User user);

    /**
     * 获取用户信息
     *
     * @param id
     * @return: com.springboot.demo.entity.User
     */
    User getUserInfoById(Long id);

    /**
     * 创建关联用户
     *  @param id
     * @param user
     */
    void insertRelativeAccount(Long id, User user);

    /**
     * 获取管理员创建的关联用户
     *
     * @param user
     * @param pageRequest
     * @return: com.springboot.demo.entity.PageResult
     */
    PageResult getRelativeAccounts(User user, PageRequest pageRequest);

    /**
     * 修改管理员创建的关联用户
     *
     * @param pid
     * @param user
     * @return: void
     */
    void updateRelativeAccount(Long pid, User user);

    /**
     * 删除关联用户
     *
     * @param pid
     * @param id
     * @return: void
     */
    void deleteRelativeAccount(Long pid, Long id);

    /**
     * 校验用户是否有权限操作关联账号
     * @param parentUser
     * @param relativeUser
     * @return: java.lang.Boolean
     */
//    public Boolean hasAuthority(User parentUser, User relativeUser);


    /**
     * 更新用户信息
     *
     * @param id
     * @param user
     */
    void updateUserInfo(Long id, User user);

    /**
     * 获取关联账号信息
     *
     * @param implUser
     * @param id
     * @return: com.springboot.demo.entity.User
     */
    User getRelativeAccount(User implUser, Long id);

    /**
     * 保存系统登录日志
     *
     * @param uid
     * @param systemLog
     * @return: void
     */
    void saveSystemLog(Long uid, SystemLog systemLog);

    /**
     * 获取系统登录日志
     *
     * @param user
     * @param pageQuery
     * @return: com.springboot.demo.entity.PageResult
     */
    PageResult getSystemLog(User user, PageRequest pageQuery);

//    /**
//     * 将该管理员账号下的所有账号状态改为失活
//     *
//     * @param id
//     * @return: void
//     */
//    void updateUserState(Long id);

    /**
     * 校验用户名
     *
     * @param username
     * @return: void
     */
    void checkUsername(String username);

    /**
     * 获取用户头像
     *
     * @param id
     * @param userId
     * @param response
     * @return: void
     */
    void getProfile(Long id, Long userId, HttpServletResponse response) throws IOException;

    /**
     * 校验图形验证码
     *
     * @param imgCode
     * @param request
     * @return: void
     */
    void checkImgCode(HttpServletRequest request, String imgCode);

    /**
     * 【修改用户信息】中的电话校验
     * @param id
     * @param user
     * @return: void
     */
    void updatePhone(Long id, User user);

    /**
     * 根据用户名查找用户
     * @param implUser
     * @param username
     * @param deviceClusterId
     * @return: List<String>
     */
    List<String> getUserByName(User implUser, String username,Long deviceClusterId);

    /**
     * 获取所有注册管理员用户信息
     * @param pageRequest
     * @return: com.springboot.demo.entity.PageResult
     */
    PageResult getAllAdminUser(PageRequest pageRequest);

    /**
     * 激活用户（注册之后需要激活才能使用）
     * @param userId
     * @param regId
     * @return: void
     */
    void activeUser(Long userId,Long regId);

    /**
     * 锁定用户
     * @param ownerId
     * @param lockUserId
     * @param locked
     * @return: void
     */
    void lockUser(Long ownerId,Long lockUserId, Integer locked);

    /**
     * 给用户账号续期
     * @param ownerId
     * @param regId
     * @param month
     * @return: void
     */
    void addUserExpireDate(Long ownerId,Long regId, Integer month);

    /**
     * 校验是否是关联用户
     * @param user1
     * @param user2
     * @return: void
     */
    void checkUserRelative(User user1,User user2);
}
